#include "gd32f30x.h"
#include "stdint.h"
#include "stdio.h"
#include "version.h"

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "timers.h"

#include "DevicesKey.h"
#include "DevicesLed.h"
#include "DevicesQueue.h"
#include "DevicesTime.h"
#include "DevicesUID.h"

#include "taskKey.h"
#include "taskSoftTimer.h"


TimerHandle_t g_xTimersLedHandle = NULL;    /* Led定时刷新定时器 */
TimerHandle_t g_xTimersKeyHandle = NULL;    /* Key定时读取定时器 */
TimerHandle_t g_xTimersBeepHandle = NULL;   /* Beep定时刷新定时器 */


/*
*   函 数 名: vSoftTimerLedCallback
*   功能说明: 定时器led回调函数
*   形    参: 无
*   返 回 值: 无
*/
static void vSoftTimerLedCallback(xTimerHandle pxTimer)
{
    (void)pxTimer;

    vLedMachine();
}

/*
*   函 数 名: vSoftTimerKeyCallback
*   功能说明: 定时器key回调函数
*   形    参: 无
*   返 回 值: 无
*/
static void vSoftTimerKeyCallback(xTimerHandle pxTimer)
{
    (void)pxTimer;

    /* 有触发了新按键状态 */
    if(enumKeyMachine(&g_typeKey) != keyNormal)
    {
        /* 把有效的按键数据存入FIFO */
        enumQueuePushDatas(&g_TypeQueueKeyInput, &g_typeKey, sizeof(g_typeKey));

//        printf("valueLast: %03X, valueDown: %03X, timeDown: %d, valueUp: %03X, timeUp: %d, state: %03X\r\n",
//                g_typeKey.valueLast,
//                g_typeKey.valueDown,
//                g_typeKey.timeDown,
//                g_typeKey.valueUp,
//                g_typeKey.timeUp,
//                g_typeKey.state);

        if((g_typeKey.valueDown & KEY_HOME) && (g_typeKey.state == keyLong))
        {
            /* 软件重启 */
            NVIC_SystemReset();
        }

//        /* 给出信号量，以启动任务执行解析 */
//        xTaskNotifyGive(g_TaskKeyHand);
    }
}


/*
*   函 数 名: cSoftTimerInit
*   功能说明: 操作系统软件定时器初始化
*   形    参: 无
*   返 回 值: 错误值
*/
int8_t cSoftTimerInit(void)
{
    /*创建定时器*/
    g_xTimersLedHandle  = xTimerCreate("Timer led",     20 / portTICK_RATE_MS,   pdTRUE, (void*)NULL, vSoftTimerLedCallback);
    xTimerStart(g_xTimersLedHandle, 200);

    g_xTimersKeyHandle  = xTimerCreate("Timer key",     20 / portTICK_RATE_MS,   pdTRUE, (void*)NULL, vSoftTimerKeyCallback);
    xTimerStart(g_xTimersKeyHandle, 200);

    return 0;
}
